package com.xm.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@Slf4j
public class StringUtil {
    public static void main(String[] args) {
        System.out.println(formatDecimal(0, 2, null));//3.15
        System.out.println(formatDecimal(3.145D, 2, RoundingMode.HALF_UP));//3.15
        System.out.println(formatDecimal(3.1D, 2, RoundingMode.HALF_UP));//3.10
        System.out.println(formatPrice(1000000.123D, 2, RoundingMode.HALF_UP, true));
    }

    //私有化构造方法
    private StringUtil() {
    }

    private static final NumberFormat nf = NumberFormat.getNumberInstance();

    /**
     * 取约数并格式化输出
     * @param value 小数
     * @param scale 精度
     * @param mode 取约模型
     * @return String
     */
    public static String formatDecimal(double value, int scale, RoundingMode mode){
        String format = "%." + scale + "f";
        if(scale < 0 || mode == null){
            return String.format(format, value);
        }

        return String.format(format, BigDecimal.valueOf(value).setScale(scale, mode).doubleValue());
    }

    /**
     * 取约数并格式化输出
     * @param value 小数
     * @param scale 精度
     * @param mode 取约模型
     * @return String
     */
    public static String formatPrice(double value, int scale, RoundingMode mode, boolean groupingUsed){
        if(scale < 0 || mode == null){
            return nf.format(value);
        }

        nf.setMaximumFractionDigits(scale);
        nf.setRoundingMode(mode);
        // 逗号分隔数字，适用于价格金额
        nf.setGroupingUsed(groupingUsed);
        return nf.format(value);
    }

    /**
     * 整数格式化补零
     * @param value 整数
     * @param len 补零的长度
     * @return 返回补零后的字符串
     */
    public static String formatZero(int value, int len){
        return String.format("%" + len + "d", value).replaceAll(" ", "0");
    }

    /**
     * 按大小重新拆分集合
     * @param list 等待拆分的集合
     * @param batchSize 拆分大小
     * @return 返回重新分组的集合
     */
    public static List<List<?>> groupBatchSize(List<?> list, int batchSize){
        List<List<?>> chunks = new ArrayList<List<?>>();
        int len = list.size();
        for (int i = 0; i < len; i += batchSize) {
            int endIndex = Math.min(i + batchSize, len);
            List<?> sublist = list.subList(i, endIndex);
            chunks.add(sublist);
        }
        return chunks;

    }

}
